﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;

namespace TD.bom
{
    /// <summary>
    /// Classe représentant la carte
    /// </summary>
    public class Map
    {
        #region Propriétés

        /// <summary>
        /// Nom du template à partir duquel cette carte a été créée
        /// </summary>
        public string TemplateName { get; protected set; }

        /// <summary>
        /// Largeur en case de la carte
        /// </summary>
        public int Width { get; protected set; }

        /// <summary>
        /// Hauteur en cases de la carte
        /// </summary>
        public int Height { get; protected set; }

        /// <summary>
        /// Cases constituant la carte 
        /// </summary>
        public Case[,] Cases { get; protected set; }

        /// <summary>
        /// Taille en pixel d'une case
        /// </summary>
        public MapObjectSize CaseSize { get; private set; }

        /// <summary>
        /// Les éléments présents sur la carte
        /// </summary>
        public List<MapObject> Objects
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }

        /// <summary>
        /// Les WayPoints de la carte
        /// </summary>
        public List<WayPoint> WayPoints
        {
            get;
            protected set;
        }

        /// <summary>
        /// Vagues de monstres
        /// </summary>
        public List<TD.bom.Wave> Waves
        {
            get;
            protected set;
        }

        /// <summary>
        /// Vague courrante
        /// </summary>
        public Wave CurrentWave
        {
            get;
            protected set;
        }

        /// <summary>
        /// Templates des tours de cette carte
        /// </summary>
        public TowerTemplate[] TowerTemplates
        {
            get;
            protected set;
        }

        #endregion

        /// <summary>
        /// Construit une carte à partir d'un template de carte
        /// </summary>
        /// <param name="p_templateName">Nom du template de carte</param>
        public Map(string p_templateName)
        {
            // Intégrité des paramètres
            if (string.IsNullOrEmpty(p_templateName))
            {
                throw new ArgumentNullException("p_templateName", "Le nom de la carte est nécessaire");
            }

            // Chargement du template
            MapTemplate l_mapTemplate = MapTemplate.Get(p_templateName);

            // Initialisation à partir du template
            TemplateName = p_templateName;

            // Taile de la grille de case
            Height = l_mapTemplate.CaseTemplateNames.GetLength(0);
            Width = l_mapTemplate.CaseTemplateNames.GetLength(1);

            // Taille d'une case
            CaseSize = l_mapTemplate.CaseSize;

            // Création des cases
            Cases = new Case[Height, Width];

            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    Case l_newCase = new Case(this, l_mapTemplate.CaseTemplateNames[y, x]);
                    l_newCase.Position.X = x * CaseSize.Width;
                    l_newCase.Position.Y = y * CaseSize.Height;
                    Cases[y, x] = l_newCase;

                    // Ajout au rendu du jeu
                    Game.Instance.Renderer.AddObject(l_newCase);
                }
            }

            // Les points de passage
            WayPoints = new List<WayPoint>();

            for (int i = 0; i < l_mapTemplate.WayPoints.Length; i++)
            {
                WayPoints.Add(new WayPoint(Cases[(int)l_mapTemplate.WayPoints[i].Y, (int)l_mapTemplate.WayPoints[i].X]));
            }

            // Tours dispos sur la carte
            TowerTemplates = new TowerTemplate[l_mapTemplate.TowerTemplateNames.Length];

            for (int i = 0; i < l_mapTemplate.TowerTemplateNames.Length; i++)
            {
                TowerTemplates[i] = TowerTemplate.Get(l_mapTemplate.TowerTemplateNames[i]);
            }

            // Les vagues
            Waves = new List<Wave>();
            for (int i = 0; i < l_mapTemplate.WavesData.Length; i++)
            {
                Waves.Add(new Wave(this, l_mapTemplate.WavesData[i]));
            }

            // La vague courrante est la 1ère
            CurrentWave = Waves[0];

            // On la lance
            CurrentWave.Lauch();
        }

        /// <summary>
        /// Itération de la boucle "physique" du jeu
        /// </summary>
        public void DoPhysics()
        {
            // Physique de la vague de monstre courrante
            if (CurrentWave != null)
            {
                CurrentWave.DoPhysics();
            }
        }
    }
}
